#define _CRT_SECURE_NO_WARNINGS 1


#include <stdio.h>

/*
结构成员访问操作符
结构体
概念
结构体是一种  自定义  的类型，是自己创造的

结构体的声明
格式:
struct tag(标签)
{
	member-list;(成员列表)
}variable-list（变量列表）;

如:
struct Stu
{
	char name[20];//名字
	int age;      //年龄
	float score;  //成绩
};


结构体变量的定义和初始化
初始化用大括号，如果想随便给值，要写".变量名 = 什么" 的形式写

结构成员访问操作符   结构体变量名.成员名



*/

struct B
{
	char c;
	int m;
};

struct Stu
{
	char name[20];//名字
	int age;      //年龄
	struct B bb;
	float score;  //成绩
}s5, s6, s7;//全局变量


struct Stu s4;//全局变量

int main()
{
	struct Stu s1 = { "张三", 20,{'q',100}, 95.5f };//局部变量
	struct Stu s2 = { .age = 18,.score = 98.5f,.name = "lisi",.bb = {'q',20} };
	struct Stu s3;



	printf("%s\n", s1.name);//结构成员访问操作符   结构体变量名.成员名
	printf("%d\n", s1.age);
	printf("%c\n", s1.bb.c);
	printf("%d\n", s1.bb.m);


	return 0;
}

typedef sturct student{
	string name;
	int age;
	string hobby;

}Stu1;
//取别名


//自己修改了一下

typedef struct Birthday { //Birthday  定义是可以不写后面要写
	int year;
	int month;
	int day;
}Birthday;

typedef struct Student{
	int id;
	char name[20];
	int age;
	float score;
	Birthday birthday;
	                                                                   
}Student;


int main() 
{


	Student stu[3] = {
					 { 1001,"晨曦",24,100.0f,{2010,4,14}},
					 { 1002,"李承",29,87.0f,{2010,7,25} },
					 { 1003,"宋佳",25,92.0f,{2010,5,27} } 
														};

	Student tmp;
	int i = 0;
	int j = 0;

	for (i = 0; i < 2; i++)
	{
		for (j = 0; j < 2 - i; j++)
		{
			if (stu[j].score > stu[j + 1].score)
			{
				tmp = stu[j];
				stu[j] = stu[j + 1];
				stu[j + 1] = tmp;
			}
		}
	}
	printf("\n按成绩升序排序后的学生信息：\n");
	printf("学号\t名字\t年龄\t成绩\t生日\n");
	for (int i = 0; i < 3; i++) 
	{
		printf("%d\t%s\t%d\t%.2f\t%d-%02d-%02d\n", 
		stu[i].id,stu[i].name,stu[i].age, stu[i].score,stu[i].birthday.year,stu[i].birthday.month,stu[i].birthday.day);//stu[i].birthday.day  --  结构体的嵌套
	}

	return 0;
}


//比如
typedef struct
{
	int a;
	char name[20];

}S1;
int main()
{
	S1 str1 = { 2,"御姐" };

	printf("学号 = %d\n名字 = %s\n", str1.a,str1.name);

	return 0;
}

//结构体的内存计算

typedef struct
{
	int a;//4个字节
	char c;//1个字节
	加这个类型  char t[3]; //还是占8个字节
}A;


typedef struct
{
	int id;
	char name[20];

}S1;

void printfStu(S1* pStu)
{
	printf("学号:%d\n名字%s\n", pStu->id, pStu->name);
}
//在结构体指针中，指针要去访问成员时，要用"箭头"去访问，
//但是结构体嵌套了，指针用箭头指向，但是访问内部成员还是用"."访问
//如上面使用指针    -    pStu -> birthday.year  这样访问

int main()
{
	S1 stu1 = { 2,"御姐" };
	S1 stu2 = { 3,"晨曦" };

	S1* pStu = &stu1;  //声明结构体指针

	printfStu(pStu);

	pStu = &stu2; //指针重新指向stu2

	printfStu(pStu);


	printf("学生结构体所占字节数:%d\n", sizeof(S1));
	printf("A结构体所占字节数:%d\n", sizeof(A)); //程序会出现  内存对齐的问题


	return 0;
}


//结构体数组

typedef struct
{
	int id;
	char name[20];

}S1;

void printfStu(S1* pStu,int len)
{
	for (int i = 0;i < len;i++)
	{
		printf("学号:%d\n名字%s\n", pStu[i].id, (pStu + i)->name); //结构体数组打印 ,两种方式都可以，看自己喜欢哪一种
	}
	
}


int main()
{
	S1 stu[] = {{ 2,"御姐" }, { 3,"晨曦" }};//结构体数组

	S1* pStu = &stu;  //声明结构体指针

	printfStu(pStu,sizeof(stu)/sizeof(stu[0]));


	return 0;
}

